/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import entidade.Constantes;
import entidade.Sms;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.SocketConnection;
import view.Inicio;

/**
 *
 * @author Weslei
 */
public class SocketConsulta extends Thread {

    private OutputStream os;
    private Inicio tela;
    private SocketConnection sc = null;
    private SMSender sender = null;
    
    private ThreadProcessamento tp;
    
    private Vector mensagens = new Vector();
    
    public SocketConsulta(Inicio tela) {
        this.tela = tela;
    }

    public void notificarEnvio(boolean status, Sms sms) throws Exception {
        String msg = "SMS";
        if (status) {
            msg += "OK";
            msg += Constantes.SEPARATOR + sms.getNumero();
        } else {
            msg += "NOK";
            msg += Constantes.SEPARATOR + sms.getNumero() + Constantes.SEPARATOR + sms.getErro();
        }
        tela.atualizarTexto("notificando envio\n" + msg);
        enviar(msg);
    }

    public void interrupt() {
        tp.interrupt();
        tp = null;
        super.interrupt();
    }
   
    
    public void run() {
        try {
            sender = new SMSender();
            
            tp = new ThreadProcessamento();
            tp.start();
            
            sc = (SocketConnection) Connector.open("socket://" + Constantes.CONECTAR);
            sc.setSocketOption(SocketConnection.LINGER, 0);
            sc.setSocketOption(SocketConnection.KEEPALIVE, 1);
            
            tela.atualizarTexto("Consultando mensagens");
            
            os = sc.openOutputStream();
            InputStream is = sc.openInputStream();
            
            //ja incia consultando ultimo sms
            enviar(Constantes.CONSULTAR_SMS);

            //fica escutando a resposta do servidor
            while (true) {
                byte[] buf = new byte[256];
                int ch = is.read(buf);
                if (ch < 0) {
                    break;
                }
                String retorno = new String(buf, 0, ch);
                if (retorno.startsWith("vazio")) {
                    try {
                        Thread.sleep(15000);
                    } catch (InterruptedException e) {
                        break;
                    }
                } else {
                    synchronized (mensagens) {
                        mensagens.addElement(retorno);
                        mensagens.notifyAll();
                    }
                }
                //consultando ultimo sms
                enviar(Constantes.CONSULTAR_SMS);
            }

        }catch(InterruptedException e){
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        } finally{
            fechar();
            tela.iniciar();
        }

        
    }
    
    private class ThreadProcessamento extends Thread {
        public void run() {
            while (true) {
                //System.out.println("passando ThreadProcessamento");
                synchronized (mensagens) {
                    if (mensagens.size() > 0) {
                        for (int i = 0; i < mensagens.size(); i++) {

                            String retorno = (String) mensagens.elementAt(i);

                            //System.out.println("processando: "+retorno);
                            
                            tela.atualizarTexto("recebido do servidor\n" + retorno);
                            try {
                                String numero = retorno.substring(0, 10);
                                String msg = retorno.substring(10);

                                Sms sms = new Sms();
                                sms.setNumero(numero);
                                sms.setMensagem(msg);

                                System.out.println(sms.getNumero());
                                System.out.println(sms.getMensagem());

                                try {
                                    sender.send(sms.getMensagem(), sms.getNumero());
                                    notificarEnvio(true, sms);
                                } catch (Exception ex) {
                                    ex.printStackTrace();
                                }
                                
                            } catch (Exception e) {
                                tela.atualizarTexto(e.getMessage());
                            }
                        }
                    }
                    mensagens.removeAllElements();
                    try {
                        mensagens.wait();
                    } catch (InterruptedException ex) {
                    }
                }
            }
        }
    }
        
    
    private void fechar(){
            try {
                sc.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            try {
                sender.fechar();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            
            tp.interrupt();
            tp = null;
    }

    private void enviar(String envio) throws Exception {
        try {
            os.write((envio).getBytes());
            os.flush();
        } catch (Exception e) {
            throw e;
        }
    }
}
